/* SINTACTICO */
grammar AnaANTLR;

@header{ package pl.equipo13.p6; }

@lexer::header{ package pl.equipo13.p6; }

@rulecath { }

entrada: (regla)+;
regla: IREGLA DOSPUNTOS regla_unitario SEPARADOR;
regla_unitario: regla_base (OPERADORUNITARIO)? ( (OR)? regla_base OPERADORUNITARIO?)*; 
regla_base: (IREGLA | ITOKEN | CADENA | FIN) | (APARENTESIS regla_unitario CPARENTESIS);

/* LEXICO */
fragment LETRA_MIN : ('a'..'z');
fragment LETRA_MAY : ('A'..'Z'); 
fragment COMILLAS: '"';

APARENTESIS: '(';
CPARENTESIS: ')';
DOSPUNTOS: ':';
SEPARADOR: ';';

fragment ASTERISCO: '*';
fragment MAS: '+';
fragment OPCIONAL: '?';
OR: '|';
FIN: 'EOF';

OPERADORUNITARIO: ASTERISCO | MAS | OPCIONAL;

IREGLA: LETRA_MIN (LETRA_MIN | '_')+;
ITOKEN: LETRA_MAY (LETRA_MAY | '_')+; 

CADENA: COMILLAS (options { greedy=false; }:.)* COMILLAS;
BLANCO: (' '|'\t'|'\n'|'\r\n'){$channel=HIDDEN;};